home *** CD-ROM | disk | FTP | other *** search
/ PC World Interactive 7 / PC World Interactive 7.iso / program / cprog.EXE / C15.TXT < prev    next >
Text File  |  1996-07-05  |  18KB  |  445 lines

  1. C-Dili 15. Konu
  2.  
  3. C ve MS-DOS ile Ekran Duzeni
  4.  
  5. Simdiye kadar kacindigim bir konu ise, ekrani silme, cursor'un yerini
  6. ogrenme yada degistirme, ekranin calisma modunu degistirme gibi konular
  7. iceren ekran duzenidir. Aslinda C nin bir parcasini olusturmamakla
  8. birlikte, bu konu programcilar icin cok onemlidir.
  9.  
  10. C ye sonradan eklenen bir 'uzanti' oldugu, ve sadece MS yada PC-DOS ile
  11. calisan bilgisayarlarda kullanilabilecegi icin, burada gorecegimiz
  12. int86() fonksiyonu, su anda sadece Microsoft C, ve Turbo C tarafindan
  13. desteklenmektedir. Derleyiciniz baska ise, bu fonksiyon cagirilis
  14. metodunu degistirmeniz gerekebilir.
  15.  
  16. Cok sayida degisik turde ekran tipleri ile kullanilabilecegi icin, C de
  17. tanimlanmis, hazir ekran fonksiyonlari yoktur. Bu fonksiyonlar,
  18. kullanilacak cihazin yapisina gore tanimlanabilir. Bu konu icerisinde,
  19. elimizdekinin bir IBM-PC yada uyumlu bilgisayar oldugunu kabul edecegiz.
  20.  
  21.  
  22. Ekrana Nasil Eriselim?
  23.  
  24. Temelde, 3 cesit yoldan ekrana erisebiliriz:
  25.  
  26.         1) bir BIOS interruptu ile,
  27.         2) DOS'un ANSI.SYS i ile,
  28.         3) Direk donanima 'karisarak'.
  29.  
  30. Her bir metodun avantaj ve dezavantajlari vardir. Daha derine dalmadan
  31. once, dilerseniz bu 'interrupt' lafinin manasini cozelim:
  32.  
  33. Interrupt
  34.  
  35. IBM PC ailesi, donanim yada yazilim tarafindan yaratilabilecek
  36. interruptlar ile idare edilebilir. Bir interrupt olustugunda,
  37. bilgisayarin calismasi, bu interruptu halledebilecek bir rutine
  38. yollanir. Bu rutinlerin baslangic adresleri, 'interrupt vektor
  39. tablosu'nda saklanir. Bu tablo, bilgisayarin hafizasinin en alt
  40. kesiminde, ilk bir kilobytelik yerde bulunur. Bu sahada 255 ayri
  41. interrupt icin yer ayrilmistir.
  42.  
  43. Ornegin, 5. interrupt olustugunda, sistem ilk olarak butun
  44. registerleri (birazdan anlatacagim) saklar, ve bu ilk 1K lik tablodan,
  45. 5. "kutu" ya bakip buradaki adresi okur. Sonra, buradan ogrendigi
  46. adrese atlar ve orada ne islemler varsa yapar. Bunlar bitince, tekrar
  47. kaldigi isleme geri doner.
  48.  
  49. Donanim Interruptlari (Hardware Interrupts): Bunlar, sistem tarafindan
  50. cagirilan rutinlerdir. Ornegin sistem, her saniyede 18.2 kere bir
  51. interrupt ile saatini ilerletmektedir. Bu cagirim, yada interrupt,
  52. donanim tarafindan yaratilmaktadir. Diger bir baska interrupt ise, 9.
  53. klavye interruptudur. Her tusa basildiginda, bu donanim interruptu
  54. olusur.
  55.  
  56. Yazilim Interruptlari (Software Interrupts): Bunlar ise, herhangi bir
  57. programin cagirabilecegi bir rutinler kutuphanesidir. Ekrana birsey
  58. yazmak gerektigine, yada silmek gerektiginde, bunu bir interrupt
  59. cagirarak yapariz.
  60.  
  61. BIOS nedir? (BIOS==Basic Input/Output System)
  62.  
  63. BIOS'un gorevi, bilgisayarin yapmasi gereken temel servisleri yerine
  64. getirmektir. Genis anlamda, BIOS IBM'in icindeki yongalarda bulunan
  65. rutinler kutuphanesidir. BIOS, DOS ile donanim arasinda bir yerde
  66. bulunur. Bir taraftan, bir programdan yapilmasi gereken standart BIOS
  67. komutunu alir. Programimiz, BIOS a bu istegi, bir interrupt vasitasi
  68. ile bildirir. BIOS un diger tarafi ise, bilgisayarin donanim parcalari
  69. (ekran, disk drive, seri port, vs.) ile iliski kurar. BIOS'un bu
  70. tarafi ise, dikkati cekmek icin bir interrupt yaratan bir donanim ile
  71. konusur.
  72.  
  73. DOS nedir?
  74.  
  75. DOS ise, bir baska kutuphanedir. Ozellikle diske erisimde uzmanlasmis
  76. olan DOS, bundan baska ekrana yazma, yaziciya bilgi yollama, vs. gibi
  77. servisleri de kapsar.  DOS'un da ayni BIOS gibi interruptlari ve
  78. sagladigi bircok servis vardir. Aslinda DOS, cogu bu servisler icin
  79. BIOS'dan yardim gormektedir.
  80.  
  81. Aklinizda bulunsun: BIOS yongalarda bulunur, DOS ise sonradan
  82. yuklenir.
  83.  
  84. Simdi, BIOS ile nasil ekran kontrolu yapabilecegimizi gorelim. Bir
  85. kere, butun BIOS ekran fonksiyonlari, bir interrupt ile cagirilir,
  86. bunun da interrupt numarasi 16 dir. Herhangi bir BIOS fonksiyonunu
  87. kullanmak icin yapmamiz gerekenler, once bazi registerleri
  88. degistirmek, onaltinci interruptu cagirmak, ve sonuclari zevkle
  89. seyretmektir.
  90.  
  91. Register?
  92.  
  93. IBM-PC ailesinin kullandigi 8088 yongasinin, calismasinda kullandigi
  94. bazi ozel sahalar vardir. Bu sahalara "register" ismi verilir. IBM-PC
  95. de, toplam olarak ondort tane register vardir. PC bunlari, aritmetik
  96. islemler, karsilastirmalar gibi islerde kullanir. Bunlardan dort
  97. tanesini BIOS interruptlari ile kullanacagiz. Bu kullanacaklarimizin
  98. isimleri, AX,BX,CX ve DX dir. Bunlar ayni birer degisken gibi
  99. iclerinde degerler tasiyabilirler. Bu registerlerin bir ozelligi ise,
  100. ister tam olarak, yani butun AX'i birden, istersek de yarim yarim (AH
  101. ve AL yi) degerlerini degistirmemiz mumkundur.
  102.  
  103. Yani, dilersek AX in icine bir 16 bitlik veri koyabiliriz, yada AL ve
  104. AH lerin iclerine sekizer bitlik veri koyabiliriz. Hep AX i
  105. kullandigima bakmayin, BX i BL ve BH, CX i CH ve CL diye, DX i DL ve
  106. DH diye ayirmamiz mumkun.
  107.  
  108. Dilerseniz soyle dusunun: Sayet CX dersek, asagidaki butun yapiyi
  109. kastediyoruz:
  110.  +--+--+--+--+--+--+--+--+  +--+--+--+--+--+--+--+--+
  111.  |                       |  |                       |
  112.  +--+--+--+--+--+--+--+--+  +--+--+--+--+--+--+--+--+
  113.           CH                            CL
  114. Fakat, CH yada CL dersek yarisini kastediyoruz. Yani CX=5 desek,
  115. yukaridaki kutulara:
  116.  
  117.  +--+--+--+--+--+--+--+--+  +--+--+--+--+--+--+--+--+
  118.  | 0  0  0  0  0  0  0  0|  | 0  0  0  0  0  1  0  1|
  119.  +--+--+--+--+--+--+--+--+  +--+--+--+--+--+--+--+--+
  120.           CH                            CL
  121.  
  122. koymus oluruz.. (binary 101, 5 e esittir) Fakat CH=6 desek,
  123.  
  124.  +--+--+--+--+--+--+--+--+  +--+--+--+--+--+--+--+--+
  125.  | 0  0  0  0  0  1  1  0|  | 0  0  0  0  0  1  0  1|
  126.  +--+--+--+--+--+--+--+--+  +--+--+--+--+--+--+--+--+
  127.           CH                            CL
  128.  
  129. CL nin eski degerine dokunmamis oluruz. Bir onceki ornekte icine '101'
  130. koydugumuz icin, CL hala o degerde kaldi. Aslinda butun bunlari
  131. bilmemize luzum yok, fakat ileride isinize yarayabilir.
  132.  
  133.  
  134. Cursor Pozisyonunu Ayarlamak:
  135.  
  136. Dilerseniz ilk olarak ekranin istedigimiz bir yerine atlayip, oraya
  137. birseyler yazmayi deneyelim. Bunun icin cursor, yani, bundan sonra
  138. yazilacak noktanin degistirilmesi gereklidir. (Cursor, yanip sonen bir
  139. alt-cizgi gorumundedir, ve donanim ile kontrol edilir.)
  140.  
  141. POSDEGIS.C:
  142. =========================================================
  143. #include <dos.h>
  144.  
  145. void yerlestir(satir,kolon)     /* Bu fonksiyon, cursoru istedigimiz    */
  146. unsigned satir,kolon;           /* bir yere koyar */
  147. {
  148.     union REGS giris_register,cikis_register;
  149.  
  150.     giris_register.h.ah = 2;        /* 2: set-cursor-position fonksiyonu*/
  151.     giris_register.h.dh = satir;
  152.     giris_register.h.dl = kolon;
  153.     giris_register.h.bh = 0;        /* hangi sayfayi degistirelim?      */
  154.  
  155.     int86(16,&giris_register,&cikis_register);    /* cagiralim, yapsin  */
  156. }
  157. ==========================================================
  158.  
  159. Ilk satirda gordugunuz #include <dos.h>, bu programda sart. Cunku daha
  160. sonra gelen 'union' u tanimliyor. Bu union ile, iki tane degisken
  161. tanimliyoruz, bunlar giris_register ve cikis_register olarak. Daha
  162. sonra, bunlarin gereken elemanlarina verileri atiyoruz. Burada, hangi
  163. elemana hangi verinin konacagi, ve servis numarasi (bizde 2) gibi
  164. verileri, ya MS-DOS Technical Reference Manual'dan yada Peter
  165. Norton'un Programmer's Guide To the IBM-PC den bulabilirsiniz. En son
  166. olarak, int86 fonksiyonu ile, 16. interruptu cagiriyoruz. Sistem ilk
  167. olarak gidip o hafizanin ilk 1K sindaki tablodan 16. interruptun
  168. rutinlerinin baslangic adresini ogreniyor. Daha sonra o adrese
  169. atlayip, ikinci fonksiyonunun yerine geciyor, ve register degerlerine
  170. gore istedigimizi yerine getiriyor.
  171.  
  172. Ozet:  Cursor'u Yerlestirme Fonksiyonu
  173. Interrupt no: 16    Servis No: 2
  174. Gereken Veriler:    AH=Servis numarasi, yani 2,
  175.                     DH=satir numarasi,
  176.                     DL=kolon numarasi,
  177.                     BH=Kullanilacak Sayfa Numarasi
  178.  
  179. Bu sayfa numarasi parametresini merak edebilirsiniz. Normal bir
  180. monokrom ekranin, sadece bir sayfasi vardir. Fakat ornegin CGA (Color
  181. Graphics Adaptor), yani renkli adaptoru 'text' yada metin modunda
  182. calistiginda, sayet satira-40 karakter modundaysa 8 sayfa, sayet
  183. satira-80 karakter modundaysa, 4 sayfayi kullanabilir. Herhangi bir
  184. anda bu sayfalardan biri ekranda gosterilebilir. (Evet - sayfa
  185. degistirmek icin bir baska fonksiyon cagirmak gerekli.) Bazi
  186. programlar bu ozelligi, bir sayfayi kullaniciya gosterirken, bir
  187. digerini hazirlayarak, super-hizli ekran goruntuleri saglamakta
  188. kullanirlar. Ikinci merak edebileceginiz sey,
  189.  
  190. Cursor Pozisyonunu Okumak
  191.  
  192. olabilir. Bu da, yukaridaki yaziyi anladiysaniz, son derece kolaydir.
  193. Bu sefer, interrupt'u cagirdiktan sonra donen degerlerle de
  194. ilgilenmekteyiz:
  195.  
  196. POSOGREN.C:
  197. =========================================================
  198. #include <dos.h>
  199.  
  200. void posogren(satir, kolon)  /* Bu fonksiyon, cursorun yerini BIOS yardimi */
  201. unsigned *satir, *kolon;     /* ile ogrenir */
  202. {
  203.     union REGS giris,cikis;
  204.  
  205.     giris.h.ah = 3;     /* fonksiyon 3 - cursorun yerini oku */
  206.     giris.h.bh = 0;     /* 0 inci sayfa.. */
  207.  
  208.     int86(16,&giris,&cikis);
  209.  
  210.     *satir = cikis.h.dh;    /* 3. fonksiyondan donen degerler:  */
  211.     *kolon = cikis.h.dl;    /* DH icinde, cursorun satir no su, */
  212. }                           /* ve DL icinde kolon numarasi..    */
  213. =================================================================
  214.  
  215. Bu programi calistiran ana program, soyle olabilir:
  216.  
  217. main()
  218. {
  219.     int a,b;
  220.     posogren(&a,&b);
  221.     printf(" Program calistiginda cursor %d. satir, %d. kolonda idi\n",a,b);
  222. }
  223.  
  224. a ve b nin adreslerinin gecirildigine dikkatinizi cekerim.
  225.  
  226. REGS Union'un Parcalari
  227.  
  228. Iki programdir gordugunuz REGS isimli union'un parcalari, bize
  229. herhangi bir registerin herhangi bir parcasina erismemizi saglar.
  230. Sayet registerin yarisinin degerini degistirmek istiyorsak, yukaridaki
  231. gibi, degiskenden sonra 'h' koyariz, giris.h. gibi.. Bundan sonra ise,
  232. hangi registerin degismesini istedigimizi soyleriz: giris.h.cl gibi.
  233. Sayet bir registerin yarim yarim yerine tumden degistirmek istersek,
  234. 'h' yerine 'x' kullanmamiz gerekir: giris.x.bx gibi..
  235.  
  236. Ekran Tipini Ayarlamak
  237.  
  238. Yazdiginiz program, sadece seksen kolonluk bir ekranda calismak icin
  239. duzenlenmis olabilir. Bilmeyen bir kullanici da, ekrani 40 kolona
  240. ayarli iken, programi calistirmayi deneyebilir. Bu tip olaylara mani
  241. olmak icin, programinizin basinda, ekrani istediginiz tipe
  242. ayarlayabilirsiniz. Bunun icin, sifirinci servisi kullanabilirsiniz:
  243.  
  244. EKRANAYA.C:
  245. =============================================================
  246. #include <dos.h>
  247.  
  248. ekranayar(tip)      /* Bu fonksiyon, ekrani istegimiz tipe ayarlar */
  249. short tip;
  250. {
  251.     union REGS giris,cikis;
  252.  
  253.     giris.h.ah = 0;  /* 0 inci servis - mod degistirmek */
  254.     giris.h.al = tip;   /* CGA; 0: b/w text 40x25,  1: 16 renk 40x25
  255.                            2: b/w text 80x25        3: 16 renk 80x25
  256.                            4: 4 renk Gra 320x200    5: 4 gri Gra 320x200
  257.                            6: b/w Gra 640x200
  258.                      MONO: 7: b/w text 80x25    */
  259.  
  260.     int86(16,&giris,&cikis); /* ayarlayalim */
  261. }
  262. ==============================================================
  263.  
  264. Burada, ekranin yeni tipini belirtmemiz gerekli. Bunun icin, 0 ila 15
  265. arasinda bir deger vermemiz gerekiyor. Bu degerlerin 0 ila 6
  266. arasindakiler, CGA (renkli) icin, 7, monokrom icin, ve 8-10 arasi PCJr
  267. icin, ve sonrasi EGA icindir. EGA, 8 ve 9 haric diger butun ekran
  268. modlarini destekler.
  269.  
  270.  
  271. Ekrani Silmek
  272.  
  273. Gordunuz bile! Ekrani silmek, iki yoldan olabilir. Birincisi, ekranin
  274. modunu degistirmek. Degistirdiginiz mod, su anki mod bile olsa, yine
  275. de ekran silinir. Yegane dezavantaj, Compaq tipi makinelerde bu islem
  276. uzun zaman alir. Dolayisi ile, bu isi dogru yapmamiz gerekir:
  277.  
  278. EKRANSIL.C:
  279. ==============================================================
  280.  
  281.  
  282. #include <dos.h>
  283. void ekransil()          /* bu rutin, ekrani siler */
  284. {
  285.     union REGS gir;
  286.  
  287.     gir.h.ah = 6;       /* ekrani yukari kaydir: servis no su 6
  288.                            ekrani asagi kaydir: servis no 7 dir. */
  289.     gir.h.al = 0;       /* kac satir scroll edecegi 'donecegi'
  290.                            sifir olunca, butun ekrani siler */
  291.     gir.h.ch = 0;       /* sol ust kosenin satir no su */
  292.     gir.h.cl = 0;       /* sol ust kosenin kolon no su */
  293.     gir.h.dh = 23;      /* sag alt kosenin satir no su */
  294.     gir.h.dl = 79;      /* sag alt kosenin kolon no su */
  295.     gir.h.bh = 7;       /* yeni yaratilacak satirlar icin renk degeri */
  296.  
  297.     int86(16,&gir,&gir);
  298. }
  299. ==============================================================
  300.  
  301. Altinci BIOS servisi sayesinde, ekrani yukari kaydirma metodu ile
  302. silmekteyiz. Ayni servis sayesinde, CX ve DX de gordugunuz degerleri
  303. degistirerek, ekranin sadece bir parcasini 'scroll' etmek yani
  304. kaydirmak mumkundur. Kaydirma yonunu servis numarasini 6 yada 7
  305. yaparak degistirebilirsiniz. Burada gordugunu gir.h.bh deki deger ise,
  306. yeni acilacak satirlarin 'attribute' yani, rengi ve ozellikleri
  307. (parlak, yanip sonen, vs.) dir. Ayrica, yukaridaki ornekte,
  308.             gir.h.ch = 0;
  309.             gir.h.cl = 0;
  310. yerine, sadece
  311.             gir.x.cx = 0;
  312. diyebilirdik.
  313.  
  314.  
  315. Baska Interruptlar
  316.  
  317. Bu orneklerde dikkat etmisinizdir - her int86() yi cagirisimizda, ilk
  318. parametre olarak 16 yi belirttik. Bu istedigimiz interrupt'un
  319. numarasidir. Daha once soyledigim gibi BIOS un ekran fonksiyonlarinin
  320. hepsi interrupt 16 ile cagirilir. Fakat tabi, programlarimiz bununla
  321. sinirli kalmak zorunda degildir, kullanabilecegimiz daha bircok
  322. interrupt vardir. Dilerseniz, su programa bir bakin:
  323.  
  324. PRINTSCR.C:
  325. ==========================================================
  326. #include <dos.h>
  327. main()
  328. {
  329.     union REGS in;      /* buna ihtiyacimiz yok, ama tanimlamamiz lazim */
  330.     int86(5,&in,&in);   /* print-screen yapalim */
  331.  
  332. }
  333. ==========================================================
  334.  
  335. bu program, gorevi ekrani oldugu gibi yaziciya gondermek olan
  336. interrupt 5 i kullanmaktadir. Artik klavyeden PRINTSCREEN tusuna
  337. bastiginiza, sistemin ne yaptigini biliyorsunuz.
  338.  
  339. DOS ve ANSI.SYS ile Ekran Duzeni
  340.  
  341. Umarim simdi size tumuyle degisik bir ekrana erisme metodu gosterirsem
  342. bana kizmassiniz. Bu ikinci metodun birincisi ile neredeyse hicbir
  343. alakasi yok. Bu metod sayesinde, programiniz, modem ile bagli uzak bir
  344. terminalden calisabilir, DOS'un yonlendirme metodlarindan
  345. (TYPE A.TXT > PRN gibi) faydalanabilir. ANSI bir terminali olursa,
  346. herhangi bir Unix sisteminde calisabilir. Nasil mi? Cok kolay -
  347. yaptigimiz, DOS ekrana birsey gonderirken, ekran idarecisinin
  348. anlayabilecegi komutlari kullanmak. Yegane sorun, bu idarecinin siz
  349. yukleyinceye kadar calismaz olmasi. Peki, nasil yukleyebiliriz?
  350. Sistemi actiginiz diskte, CONFIG.SYS isimli bir kutuk olmasi lazim.
  351. Yoksa yaratin, ve icine:
  352.  
  353.     DEVICE=ANSI.SYS
  354.  
  355. satirini koyun.  Bundan sonra, DOS disketinde bulunan ANSI.SYS isimli
  356. kutugun, sistemi actiginiz diskte bulunmasini saglayin. Son olarak da,
  357. ANSI.SYS i yuklemek icin, CTRL-ALT-DEL e basin. Alet acildiginda, size
  358. fark ettirmeden bu idareci yuklenecektir. Bundan sonra, dilerseniz
  359. printf icinde, dilerseniz herhangi baska bir DOS u kullanan rutin ile
  360. ANSI yi kullanabilirsiniz. (Anafikir: printf, ekrana yazmak icin,
  361. diger bircok C fonksiyonu gibi, DOS'u kullanir.)
  362.  
  363. ANSI ile cursorun yerini degistirmek:
  364.  
  365. Ilk once, butun ANSI komutlari, bir ESC, yani ASCII 27 ile baslarlar.
  366. Ornegin, cursorun yerini degistirmek icin, gereken komut ESC [#;#h
  367. dir. Ilk # isaretinin yerine satir numarasi, ikincinin yerine de kolon
  368. konur. Bu, bir programda soyle gorunebilir:
  369.  
  370.               printf("\x1b[%d;%dh",satir,kolon);
  371.  
  372. (Ondalik 27 = Hex 1B )
  373.  
  374. satiri dikkatle incelerseniz, ilk once \x1b ile ESC karakterini, daha
  375. sonra [, sonra ilk rakami, sonra ; ve ikinci rakami, ve son olarak da
  376. h isaretini gorebilirsiniz. ANSI nin komut yapisi son derece sabit
  377. oldugundan, araya bosluklar katarsaniz, programiniz calismayabilir.
  378.  
  379. ANSI ile Ekrani Silmek
  380.  
  381. Ekrani silmek kolay: ESC [2j  yi ekrana yollamaniz yeterli:
  382.         printf("\x1B[2j");
  383. araya bosluk koymamaya dikkat etmelisiniz. Ayrica kucuk ve buyuk
  384. harfler farklidir.
  385.  
  386. Ekranin Rengini Ayarlamak
  387.  
  388. Bunun icin ESC [#;#m komutunu vermeniz gerekiyor. Ilk #, ekrandaki
  389. yazilarin rengi, ikincisi ise arka planin rengidir. Bu renk kodlari
  390. sunlardir:
  391.  
  392. 30 siyah yazilar
  393. 31 kirmizi yazilar
  394. 32 yesil yazilar
  395. 33 sari yazilar
  396. 34 mavi yazilar
  397. 35 magenta yazilar (kirmizimsi)
  398. 36 cyan yazilar (mavimsi)
  399. 37 Beyaz yazilar
  400.  
  401. 40 siyah arka plan
  402. 41 kirmizi arka plan
  403. 42 yesil arka plan
  404. 43 sari arka plan
  405. 44 mavi arka plan
  406. 45 magenta arka plan
  407. 46 cyan arka plan
  408. 47 beyaz arka plan
  409.  
  410. Diger ozellikler icin, ESC [#m girmeniz gerekli: # yerine,
  411.     0   normal
  412.     1   parlak
  413.     4   alt cizgi (monokrom da)
  414.     5   yanip sonen
  415.     7   ters renkler
  416.     8   gorunmez
  417.  
  418.  
  419. DOS mu, BIOS mu kullansak
  420.  
  421. DOS, ve ekran idarecisi ANSI.SYS, BIOS a nazaran daha yavas calisir,
  422. fakat bircok ortamda kullanilabileceginden, kalici programlar icin
  423. daha uygun bir cozumdur. Ornegin oyunlar gibi yasam sureleri birkac ay
  424. olan urunler ise, BIOS yada hatta direk erisim metodlarini
  425. kullanabilirler. ANSI nin dezavantaji, kullanicinin ANSI.SYS i
  426. yuklemesinin gerektigidir. Bu da, yeni kullanicilari panige kaptiran
  427. bir durumdur.
  428.  
  429. Diger Interruptlar
  430.  
  431. Gordugunuz gibi BIOS ile ilgilenirken, sadece 2 interrupt kullandik.
  432. Ekran fonksiyonlarini saglayan 16. interrupt, ve ekranin kopyasini
  433. yaziciya gonderen 5. interrupt. Bunun gibi daha bircok interrupt
  434. vardir, ve bize cok cesitli servisler sunarlar.
  435.  
  436. Ayrica, dilersek kendi interruptlarimizi da yazabiliriz. Bos olarak
  437. tanimlanmis bir interrupt vektorunu degistirip, kendi rutinimizin
  438. adresini ona verebiliriz. Yada, ornegin sidekick gibi programlarin
  439. yaptigi gibi klavyenin yarattigi interrupt sonucunda cagirilan rutini
  440. degistirebiliriz, ve diledigimiz baska birseyin yapilmasini
  441. saglayabiliriz. Bu tip programlar ilk olarak basilan tusun kendilerini
  442. harekete gecirecek tus olup olmadigini kontrol ederler, sayet degilse
  443. kontrolu eski interrupt rutinine gecirirler.
  444.  
  445.